/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.perutaxi.empr;

import com.perutaxi.entidades.eEmpresa;
import com.perutaxi.entidades.eSolicitudEmpresa;
import com.perutaxi.entidades.eUsuario;
import com.perutaxi.negocio.nEmpresa;
import com.perutaxi.negocio.nSolicitudEmpresa;
import com.perutaxi.negocio.nUsuario;
import com.perutaxi.util.GenericMBean;
import com.perutaxi.util.JavaMail;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;
import org.primefaces.context.RequestContext;

/**
 *
 * @author PeruTaxi
 */
@ManagedBean
@SessionScoped
public class SolicitudEmpresaMBean extends GenericMBean implements Serializable {

    private eSolicitudEmpresa solEmpresaFiltro;
    private eSolicitudEmpresa solEmpresa;
    private List<eSolicitudEmpresa> lista;
    private eEmpresa empresa;
    private int accion; //1:nuevo, 2:editar, 3:ver
    private String titulo; //titulo del panel
    private int accionDetalle; //1:nuevo, 2:editar, 3:ver
    private final String url = "/pages/empr/solEmpresa/solicitudEmpresa.xhtml";
    private final String urlLista = "/pages/empr/solEmpresa/listaSolicitudEmpresa.xhtml";
    private SelectItem[] siEstadosFiltro;

    public SolicitudEmpresaMBean() {
    }

    public String iniciar() {
        solEmpresaFiltro = new eSolicitudEmpresa();
        solEmpresaFiltro.setRuc("");
        solEmpresaFiltro.setRazonSocial("");
        solEmpresaFiltro.setEstado("");
        lista = null;

        return this.urlLista;
    }

    public void buscar(ActionEvent ae) {
        try {
            this.lista = nSolicitudEmpresa.obtenerSolEmpresa(this.solEmpresaFiltro);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public String editar() {
        this.accion = 2;
        this.titulo = "ACTUALIZAR SOLICITUD DE EMPRESA";

        return this.url;
    }

    public String ver() {
        this.accion = 3;
        this.titulo = "VER SOLICITUD DE EMPRESA";

        return this.url;
    }

    public String guardar() throws Exception {
        if (this.accion == 2) {
            if (nSolicitudEmpresa.actualizar(solEmpresa)) {
                showMessage("SE HA GUARDADO CORRECTAMENTE");
                return this.editar();
            } else {
                showError("ERROR AL MOMENTO DE GUARDAR");
                return null;
            }
        }

        return "";
    }

    public void nuevaEmpresa() {
        this.accionDetalle = 1;
        empresa = nEmpresa.inicializar();
        empresa.setRazonSocial(this.solEmpresa.getRazonSocial());
        empresa.setRuc(this.solEmpresa.getRuc());
        empresa.setDireccionEmpresa(this.solEmpresa.getDireccion());
        empresa.setTelefonoEmpresa(this.solEmpresa.getTelefono());
        empresa.setEmailEmpresa(this.solEmpresa.getEmail());
        empresa.setNombres(asignarNombres(this.solEmpresa.getRepresentante()));
        empresa.setApPaterno(asignarApPaterno(this.solEmpresa.getRepresentante()));
        empresa.setApMaterno(asignarApMaterno(this.solEmpresa.getRepresentante()));
    }

    public void guardarEmpresa() {
        RequestContext context = RequestContext.getCurrentInstance();
        boolean resultado = true;
        try {
            Long id = Long.valueOf(nEmpresa.obtenerTodos().size() + 1);
            this.empresa.setId(id);
            this.empresa = generarUsuario(this.empresa);
            this.solEmpresa.setEstado("C");
            nUsuario.guardar(this.empresa.getUsuario());
            if (nEmpresa.guardar(this.empresa)) {
                nSolicitudEmpresa.actualizar(this.solEmpresa);
                this.solEmpresa = nSolicitudEmpresa.obtenerPorId(this.solEmpresa.getId());
                enviarNotificacion(this.empresa);
                showMessage("SE HA GUARDADO CORRECTAMENTE");
            } else {
                showError("ERROR AL MOMENTO DE GUARDAR");
                resultado = false;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        context.addCallbackParam("CallbackParam", resultado);
    }

    public String anular() {
        this.solEmpresa.setEstado("A");
        try {
            if (nSolicitudEmpresa.actualizar(this.solEmpresa)) {
                this.solEmpresa = nSolicitudEmpresa.obtenerPorId(this.solEmpresa.getId());
                showMessage("SE HA GUARDADO CORRECTAMENTE");
            } else {
                showError("ERROR AL MOMENTO DE GUARDAR");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return this.editar();
    }

    private void enviarNotificacion(eEmpresa empresa) {
        String asunto = "CONFIRMACIÓN DE REGISTRO";
        String mensaje = "ESTIMADO USUARIO, PERUTAXI AGRADECE SU PREFERENCIA. SU USUARIO PARA EL INGRESO A LA WEB ES: " + empresa.getUsuario().getUsuario();
        mensaje += " Y SU CLAVE ES: " + empresa.getUsuario().getClave();
        JavaMail.send(empresa.getEmailEmpresa(), asunto, mensaje);
    }

    private eEmpresa generarUsuario(eEmpresa empresa) throws Exception {
        eUsuario usuario = new eUsuario();
        Long id = Long.valueOf(nUsuario.obtenerTodos().size() + 1);
        StringTokenizer tokens = new StringTokenizer(empresa.getRazonSocial());
        String clave = id + tokens.nextToken();
        usuario.setId(id);
        usuario.setUsuario(empresa.getRuc());
        usuario.setClave(clave);
        usuario.setIdRol(2L);
        usuario.setEstado(Boolean.TRUE);

        empresa.setUsuario(usuario);

        return empresa;
    }

    private String asignarNombres(String cad) {
        List<String> l = new ArrayList<String>();
        StringTokenizer tokens = new StringTokenizer(cad);
        String nombres = "";
        while (tokens.hasMoreTokens()) {
            String token = tokens.nextToken();
            l.add(token);
        }
        l.remove(l.size() - 1);
        l.remove(l.size() - 1);
        for (String x : l) {
            nombres = nombres + x + " ";
        }
        nombres = nombres.trim();

        return nombres;
    }

    private String asignarApPaterno(String cad) {
        List<String> l = new ArrayList<String>();
        StringTokenizer tokens = new StringTokenizer(cad);
        while (tokens.hasMoreTokens()) {
            l.add(tokens.nextToken());
        }
        l.remove(l.size() - 1);

        return l.get(l.size() - 1);
    }

    private String asignarApMaterno(String cad) {
        List<String> l = new ArrayList<String>();
        StringTokenizer tokens = new StringTokenizer(cad);
        while (tokens.hasMoreTokens()) {
            l.add(tokens.nextToken());
        }

        return l.get(l.size() - 1);
    }

    public String retroceder() {
        buscar(null);
        return this.urlLista;
    }

    public eSolicitudEmpresa getSolEmpresaFiltro() {
        return solEmpresaFiltro;
    }

    public void setSolEmpresaFiltro(eSolicitudEmpresa solEmpresaFiltro) {
        this.solEmpresaFiltro = solEmpresaFiltro;
    }

    public eSolicitudEmpresa getSolEmpresa() {
        return solEmpresa;
    }

    public void setSolEmpresa(eSolicitudEmpresa solEmpresa) {
        this.solEmpresa = solEmpresa;
    }

    public List<eSolicitudEmpresa> getLista() {
        return lista;
    }

    public void setLista(List<eSolicitudEmpresa> lista) {
        this.lista = lista;
    }

    public int getAccion() {
        return accion;
    }

    public void setAccion(int accion) {
        this.accion = accion;
    }

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    public SelectItem[] getSiEstadosFiltro() {
        siEstadosFiltro = new SelectItem[4];
        siEstadosFiltro[0] = new SelectItem("*", "*");
        siEstadosFiltro[1] = new SelectItem("P", "PENDIENTES");
        siEstadosFiltro[2] = new SelectItem("C", "CONFIRMADOS");
        siEstadosFiltro[3] = new SelectItem("A", "ANULADOS");

        return this.siEstadosFiltro;
    }

    public void setSiEstadosFiltro(SelectItem[] siEstadosFiltro) {
        this.siEstadosFiltro = siEstadosFiltro;
    }

    public eEmpresa getEmpresa() {
        return empresa;
    }

    public void setEmpresa(eEmpresa empresa) {
        this.empresa = empresa;
    }

    public int getAccionDetalle() {
        return accionDetalle;
    }

    public void setAccionDetalle(int accionDetalle) {
        this.accionDetalle = accionDetalle;
    }
}
